// list.h 
//    Data structures to manage LISP-like lists.  
//
//      As in LISP, a list can contain any type of data structure
//    as an item on the list: thread control blocks, 
//    pending interrupts, etc.  That is why each item is a "void *",
//    or in other words, a "pointers to anything".
//
// Copyright (c) 1992-1993 The Regents of the University of California.
// All rights reserved.  See copyright.h for copyright notice and limitation 
// of liability and disclaimer of warranty provisions.

#ifndef LIST_H
#define LIST_H

#include "copyright.h"
#include "utility.h"

// The following class defines a "list element" -- which is
// used to keep track of one item on a list.  It is equivalent to a
// LISP cell, with a "car" ("next") pointing to the next element on the list,
// and a "cdr" ("item") pointing to the item on the list.
//
// Internal data structures kept public so that List operations can
// access them directly.

class ListElement {
   public:
     ListElement(void *itemPtr, int sortKey);    // initialize a list element

     ListElement(void *itemPtr, char* val);
     ListElement *next;        // next element on list, 
                // NULL if this is the last
     int key;
     int *index;                // priority, for a sorted list
     void *item;             // pointer to item on the list
};

// The following class defines a "list" -- a singly linked list of
// list elements, each of which points to a single item on the list.
//
// By using the "Sorted" functions, the list can be kept in sorted
// in increasing order by "key" in ListElement.

class List {
  public:
    List();            // initialize the list
    ~List();            // de-allocate the list

    void Prepend(void *item);     // Put item at the beginning of the list
    void Append(void *item);     // Put item at the end of the list
    void AddProcess(ListElement*);
    void *Remove();          // Take item off the front of the list
    void RmProcess(int*);        //Remove process anywhere in the list
    bool Find(int);          //Finds out if child is in parent list
    void Print();
    void Mapcar(VoidFunctionPtr func);    // Apply "func" to every element 
                    // on the list
    bool IsEmpty();        // is the list empty? 
    bool IsProcEmpty();        // is the process list empty?
    int procNumGet();        //returns # of processes
    

    // Routines to put/get items on/off list in order (sorted by key)
    void SortedInsert(void *item, int sortKey);    // Put item into list
    void *SortedRemove(int *keyPtr);           // Remove first item from list

  private:
    ListElement *first;      // Head of the list, NULL if list is empty
    ListElement *last;        // Last element of list
    int ProcCount;         //# of processes
};

#endif // LIST_H

